home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / snip9503 / ipow.c < prev    next >
C/C++ Source or Header  |  1995-03-14  |  1KB  |  46 lines

  1. /*
  2. **  IPOW.C - Raise a number to an integer power
  3. **
  4. **  public domain by Mark Stephen with suggestions by Keiichi Nakasato
  5. */
  6.  
  7. double ipow(double x, int n)        /* return x^n */
  8. {
  9.       double t = 1.0;
  10.  
  11.       if (!n)
  12.             return 1.0;    /* At the top. 0**0 = 1 */
  13.       if (n < 0)
  14.       {
  15.             n = -n;
  16.             x = 1.0/x;  /* error if x == 0. Good                        */
  17.       }                 /* ZTC/SC returns inf, which is even better     */
  18.       if (x == 0.0)
  19.             return 0.0;
  20.       do
  21.       {
  22.             if (n & 1)
  23.                   t *= x;
  24.             n /= 2;     /* KN prefers if (n/=2) x*=x; This avoids an    */
  25.             x *= x;     /* unnecessary but benign multiplication on     */
  26.       } while (n);      /* the last pass, but the comparison is always  */
  27.       return t;         /* true _except_ on the last pass.              */
  28. }
  29.  
  30. #ifdef TEST
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34.  
  35. main(int argc, char *argv[])
  36. {
  37.       double d;
  38.       int n;
  39.  
  40.       d = atof(argv[1]);
  41.       n = atoi(argv[2]);
  42.       printf("%f^%d = %f\n", d, n, ipow(d, n) );
  43. }
  44.  
  45. #endif /* TEST */
  46.